/**
 * PerlaController - part of PerlaGis Architecture
 *
 * Copyright (C) 2010 Ricardo Gonzalez (gomnaz@gmail.com)
 * This program is free software: you can redistribute it and/or modify it under the
 * terms of the GNU General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later version.
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
 * Public License for more details.
 * You should have received a copy of the GNU General Public License along with
 * this program. If not, see http://www.gnu.org/licenses/
 */
package org.sql.entities;

/**
 * Classe che rappresenta una query SQL.
 * Può essere inizializzata sia senza parametri, sia con select e from.
 *
 * Nel caso lo statement WHERE contenga più condizioni, queste vengono legate con AND
 *
 * Esempio:
 * <code>Sql s = new Sql("*", "paesi");
 * s.setOrder("nome", 1);
 * s.addWhere("popolazione", "300000", ">");
 * System.out.println(s);</code>
 * Creerà la seguente stringa
 * <quote>SELECT * FROM paesi WHERE popolazione > 300000 ORDER BY nome DESC</quote>
 *
 * @author Ricardo Gonzalez
 * @author Eva Gjeci
 */
public class Sql {

    private String select;
    private String from;
    private SqlWhere where;
    private String order;
    private boolean desc;

    /**
     * Costrutto.
     */
    public Sql() {
    }

    /**
     * Costrutto.
     */
    public Sql(String select, String from) {
        this.select = select;
        this.from = from;
    }

    /**
     * Imposta il contento dello statement SELECT.
     *
     * @param select gli attributi da selezionare
     * @return l'oggetto Sql
     */
    public Sql setSelect(String select) {
        this.select = select;
        return this;
    }

    /**
     * Imposta il contenuto dello statement FROM.
     *
     * @param from le tabelle su cui fare l'interrogazione
     * @return l'oggetto Sql
     */
    public Sql setFrom(String from) {
        this.from = from;
        return this;
    }

    /**
     * Imposta l'attributo (come indicato nello statement SELECT) su cui fare
     * l'ordinamento e il verso di ordinamento.
     *
     * @param key l'attributo su cui ordinare
     * @param desc true se l'ordinamento deve essere decrescente
     * @return l'oggetto Sql
     */
    public Sql setOrder(String key, boolean desc) {
        this.order = key;
        this.desc = desc;
        return this;
    }

    /**
     * Aggiunge una condizione nello statemente WHERE.
     *
     * @param key la chiave su cui applicare la condizione
     * @param value la condizione che l'attributo deve soddisfare.
     * @return l'oggetto Sql
     */
    public Sql addWhere(String key, String value) {
        return addWhere(key, value, "=");
    }

    /**
     * Aggiunge una condizione nello statemente WHERE.
     *
     * @param key la chiave su cui applicare la condizione
     * @param value la condizione che l'attributo deve soddisfare.
     * @param operator l'operatore per la condizione (=, >, <, etc.)
     * @return l'oggetto Sql
     */
    public Sql addWhere(String key, String value, String operator) {
        if (where == null) where = new SqlWhere();
        where.add(key, value, operator);
        return this;
    }
    
    private String getSelect(){
        return this.select;
    }
    
    private String getFrom(){
        return this.from;
    }
    
    private String getWhere(){
        return this.where.toString();
    }
    
    private String getOrder(){
        return this.order;
    }

    private boolean getDesc(){
        return this.desc;
    }

    @Override
    public String toString() {
        String d = "";
        if (getDesc()) {
            d = "DESC";
        } else {
            d = "ASC";
        }
        String m;
        m = "SELECT " + getSelect() + " FROM " + getFrom() + " " + getWhere() + " ORDER BY " + getOrder() + " " + d;
        return "SELECT " + getSelect() + " FROM " + getFrom() + " " + getWhere() + " ORDER BY " + getOrder() + " " + d;
    }
}
